package com.mzx.javase.chouxiang;

/**
 * @Description: 抽象类，开发者
 * @Date: 2021/11/30 10:53
 * @Author: MarKing
 */

/**
 * 抽象类：包含抽象方法的类成为抽象类
 * 抽象类可包含抽象方法，也可不包含抽象方法 ，用abstract修饰的类成为抽象类，用abstract修饰的方法成为抽象方法
 * 抽象方法：用abstract修饰，只有方法的声明，没有方法体
 * <p>
 * 抽象类的作用：
 * 1、可以被子类继承，提供相同的属性和方法
 * 2、可以声明为引用类型，更自然的使用多态(父类类型的引用指向子类型的对象)
 *
 * 抽象类除了不能实例化之外，和普通的类没有任何区别(可以有方法和属性，构造函数，静态方法等)
 * 抽象类即使没有抽象方法，也不能被实例化；抽象类存在的意义就是防止被实例化
 *
 * 注意：
 * abstract关键字，不能与static,private,final一起使用
 * why：因为abstract关键字用来声明抽象方法时，抽象方法没有方法体；而static用来声明静态方法，静态方法可以被类及其对象使用；固两者矛盾
 */
public abstract class Animal {
    //抽象方法，子类继承抽象类必须实现抽象方法，除非子类声明为抽象类
    public abstract void sleep();

    public abstract void eat();

    //非抽象方法
    public void makeSound() {
        System.out.println(this.getName()+"正在叫");
    }

    //定义共有的属性
    private String name;
    private String color;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
class Cat extends Animal{

    @Override
    public void sleep() {
        System.out.println("猫正在悄咪咪睡觉。。。");
    }

    @Override
    public void eat() {
        System.out.println("猫正在吃鱼儿。。。。");
    }
}
